package com.boluo.businessManagement.service.impl;

import java.util.List;
import java.util.Objects;

import com.boluo.businessManagement.domain.*;
import com.boluo.businessManagement.dto.BusMentStoreDTO;
import com.boluo.businessManagement.dto.BusMentStoreOpinfoDTO;
import com.boluo.businessManagement.mapper.BusMentGoodsMapper;
import com.boluo.businessManagement.mapper.BusMentGoodsStoreMapper;
import com.boluo.businessManagement.mapper.BusMentStoreListinfoMapper;
import com.boluo.businessManagement.vo.BusMentStoreOpinfoVO;
import com.boluo.common.utils.DateUtils;
import com.boluo.common.utils.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.boluo.businessManagement.mapper.BusMentStoreOpinfoMapper;
import com.boluo.businessManagement.service.IBusMentStoreOpinfoService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import javax.annotation.Resource;

/**
 * 出入库管理Service业务层处理
 * 
 * @author SekonoAlpaca
 * @date 2023-05-03
 */
@Service
public class BusMentStoreOpinfoServiceImpl implements IBusMentStoreOpinfoService 
{
    @Resource
    private BusMentStoreOpinfoMapper busMentStoreOpinfoMapper;

    @Resource
    private BusMentStoreListinfoMapper busMentStoreListinfoMapper;

    @Resource
    private BusMentGoodsStoreMapper busMentGoodsStoreMapper;

    @Resource
    private BusMentGoodsMapper busMentGoodsMapper;
    /**
     * 查询出入库管理
     * 
     * @param id 出入库管理主键
     * @return 出入库管理
     */
    @Override
    public BusMentStoreOpinfo selectBusMentStoreOpinfoById(Long id)
    {
        return busMentStoreOpinfoMapper.selectBusMentStoreOpinfoById(id);
    }

    /**
     * 查询出入库管理列表
     * 
     * @param busMentStoreOpinfo 出入库管理
     * @return 出入库管理
     */
    @Override
    public List<BusMentStoreOpinfo> selectBusMentStoreOpinfoList(BusMentStoreOpinfo busMentStoreOpinfo)
    {
        return busMentStoreOpinfoMapper.selectBusMentStoreOpinfoList(busMentStoreOpinfo);
    }

    /**
     * 新增出入库管理
     * 
     * @param busMentStoreOpinfoDTO 出入库管理
     * @return 结果
     */
    @Override
    @Transactional
    public int insertBusMentStoreOpinfo(BusMentStoreOpinfoDTO busMentStoreOpinfoDTO)
    {
        // todo 参数校验
        Long storeId = busMentStoreOpinfoDTO.getStoreId();
        Long goodsId = busMentStoreOpinfoDTO.getGoodsId();
        Long amounts = busMentStoreOpinfoDTO.getAmounts();
        // 添加逻辑
        BusMentStoreOpinfo busMentStoreOpinfo = new BusMentStoreOpinfo();
        busMentStoreOpinfo.setType(busMentStoreOpinfoDTO.getNum());
        busMentStoreOpinfo.setStoreId(storeId);
        busMentStoreOpinfo.setBusiDate(busMentStoreOpinfoDTO.getBusiDate());
        busMentStoreOpinfo.setStatus(0);
        busMentStoreOpinfo.setRemark(busMentStoreOpinfoDTO.getRemark());
        busMentStoreOpinfo.setOperateDate(DateUtils.getNowDate());
        busMentStoreOpinfo.setOperatorId(SecurityUtils.getUserId());

        // 添加出入库单据
        busMentStoreOpinfoMapper.insertBusMentStoreOpinfo(busMentStoreOpinfo);

        // 添加出入库明细
        BusMentStoreListinfo busMentStoreListinfo = new BusMentStoreListinfo();
        busMentStoreListinfo.setGoodsId(goodsId);
        busMentStoreListinfo.setAmounts(amounts);
        busMentStoreListinfo.setPrice(busMentStoreOpinfoDTO.getPrice());
        busMentStoreListinfo.setBillId(busMentStoreOpinfo.getId());
        busMentStoreListinfo.setState(0);
        if (busMentStoreOpinfoDTO.getNum() == 0) {
            // 入库操作



            // 先要根据仓库id和物品id 去查有没有数据
            BusMentGoodsStore goodsStoreDB = busMentGoodsStoreMapper.selectByGoodsIdAndStoreId(goodsId,storeId);
            if (Objects.nonNull(goodsStoreDB)) {
                Long amounts1 = goodsStoreDB.getAmounts();
                long total = amounts1 + amounts;
                goodsStoreDB.setAmounts(total);
                busMentGoodsStoreMapper.updateBusMentGoodsStore(goodsStoreDB);
            }else {
                BusMentGoodsStore goodsStore = new BusMentGoodsStore();
                goodsStore.setGoodsId(goodsId);
                goodsStore.setStoreId(storeId);
                goodsStore.setAmounts(amounts);
                busMentGoodsStoreMapper.insertBusMentGoodsStore(goodsStore);
            }
        } else  {
            // 出库操作
            BusMentGoodsStore goodsStoreDB = busMentGoodsStoreMapper.selectByGoodsIdAndStoreId(goodsId,storeId);
            Long amounts1 = goodsStoreDB.getAmounts();
            long total = amounts1 - amounts;
            Assert.state(total >= 0,"库存不足");
            goodsStoreDB.setAmounts(total);
            busMentGoodsStoreMapper.updateBusMentGoodsStore(goodsStoreDB);
        }

        return   busMentStoreListinfoMapper.insertBusMentStoreListinfo(busMentStoreListinfo);

    }

    /**
     * 修改出入库管理
     * 
     * @param busMentStoreOpinfo 出入库管理
     * @return 结果
     */
    @Override
    public int updateBusMentStoreOpinfo(BusMentStoreOpinfo busMentStoreOpinfo)
    {
        return busMentStoreOpinfoMapper.updateBusMentStoreOpinfo(busMentStoreOpinfo);
    }

    /**
     * 批量删除出入库管理
     * 
     * @param ids 需要删除的出入库管理主键
     * @return 结果
     */
    @Override
    public int deleteBusMentStoreOpinfoByIds(Long[] ids)
    {
        return busMentStoreOpinfoMapper.deleteBusMentStoreOpinfoByIds(ids);
    }

    /**
     * 删除出入库管理信息
     * 
     * @param id 出入库管理主键
     * @return 结果
     */
    @Override
    public int deleteBusMentStoreOpinfoById(Long id)
    {
        return busMentStoreOpinfoMapper.deleteBusMentStoreOpinfoById(id);
    }

    /**
     * 联表查询出入库操作表和出入库单据表
     * @param busMentStoreOpinfo 查询条件
     * @return 结果集
     */
    @Override
    public List<BusMentStoreOpinfoVO> selectBusMentStoreOpinfoListAndBill(BusMentStoreOpinfo busMentStoreOpinfo) {
        return busMentStoreOpinfoMapper.selectBusMentStoreOpinfoAndBill(busMentStoreOpinfo);
    }

    @Override
    public int deleteBusMentStoreOpinfoByIdOnLogical(Long id) {
        //参数校验

        /*参数存在*/
        Assert.notNull(id,"参数违规");
        /*参数合法*/
        Assert.state(id>=0);
        /*表中无冲突*/
        BusMentStoreOpinfo busMentStoreOpinfo = busMentStoreOpinfoMapper.selectBusMentStoreOpinfoById(id);
        Assert.notNull(busMentStoreOpinfo,"参数异常");

        busMentStoreOpinfo.setStatus(-1);
        return busMentStoreOpinfoMapper.updateBusMentStoreOpinfo(busMentStoreOpinfo);
    }

    @Override
    public BusMentStoreOpinfoDTO selectBusMentStoreOpinfoBybillId(Long billId) {
        // 根据入库单据id 查明细
        BusMentStoreOpinfo busMentStoreOpinfo = busMentStoreOpinfoMapper.selectBusMentStoreOpinfoById(billId);
        BusMentStoreListinfo busMentStoreListinfo = busMentStoreListinfoMapper.selectByBillId(billId);

        BusMentStoreOpinfoDTO busMentStoreOpinfoDTO = new BusMentStoreOpinfoDTO();
        busMentStoreOpinfoDTO.setPrice(busMentStoreListinfo.getPrice());
        busMentStoreOpinfoDTO.setAmounts(busMentStoreListinfo.getAmounts());
        busMentStoreOpinfoDTO.setBusiDate(busMentStoreOpinfo.getBusiDate());
        busMentStoreOpinfoDTO.setRemark(busMentStoreOpinfo.getRemark());
        busMentStoreOpinfoDTO.setGoodsId(busMentStoreListinfo.getGoodsId());
        busMentStoreOpinfoDTO.setStoreId(busMentStoreOpinfo.getStoreId());
        BusMentGoods goods = busMentGoodsMapper.selectBusMentGoodsById(busMentStoreListinfo.getGoodsId());
        busMentStoreOpinfoDTO.setGoodsName(goods.getGoodsName());
        return busMentStoreOpinfoDTO;
    }
}
